package demo.fileserver;

import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.resource.PathResourceResolver;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URI;

@Configuration // 标记为配置类
public class WebConfig implements WebMvcConfigurer {

    // 如果前缀不同，可以用addViewController的方式
    // 如果前缀是/**,应该用Interceptor方式从根本解决问题.
    // 这是次优的解决方法,需要写很多代码
//    @Override
//    public void addInterceptors(InterceptorRegistry registry) {
//        // 自定义拦截器判断路径，非 /api 开头则转发（本质与方式1一致）
//        registry.addInterceptor(new HandlerInterceptor() {
//            @Override
//            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//                String path = request.getRequestURI();
//                // 若不是 /api 开头、且不是静态资源，转发到 index.html
//                if (!path.startsWith("/api") && !isStaticResource(path) && !path.startsWith("/index.html")) {
//                    request.getRequestDispatcher("/index.html").forward(request, response);
//                    return false;
//                }
//                return true;
//            }
//            // 辅助方法：判断是否为静态资源（js/css/img等）
//            private boolean isStaticResource(String path) {
//                return path.startsWith("/assets/") || path.endsWith("favicon.svg");
//            }
//        });
//    }

//     配置静态资源映射（可选，Spring Boot 默认已映射 static 目录，此处可省略）
//    @Override
//    public void addResourceHandlers(ResourceHandlerRegistry registry) {
//        // 1. 显式配置静态资源路径（可选，Spring Boot 默认已配置）
//        registry.addResourceHandler("/**")
//                .addResourceLocations("classpath:/static/")
//                .setCachePeriod(3600)
//                .resourceChain(true)
//                .addResolver(new PathResourceResolver() {
//                    @Override
//                    protected Resource getResource(String resourcePath, Resource location) throws IOException {
//                        Resource r = super.getResource(resourcePath, location);
//                        if (r == null || !r.exists()) {
//                            return new ClassPathResource("/static/index.html");
//                        }
//                        return r;
//                    }
//                });
//    }

//    @Override
//    public void addResourceHandlers(ResourceHandlerRegistry registry) {
//        registry.addResourceHandler("/myserver/**")
//                .addResourceLocations("classpath:/static/myserver/");
//    }

//    @Override
//    public void addViewControllers(ViewControllerRegistry registry) {
//        registry.addViewController("/myserver/**")
//                .setViewName("forward:/fileserver/index.html");
//    }

    // 还有最最优的解决方法,就是配置nginx前端,前端资源与后端不牵扯.只需要配置端口转发即可.
    // 前端 fileserver, 后端 /fileserver-api,其实很通用.特别是多个前端共用一个后端的情况,/api可以只配置一个反向代理即可.

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        // 映射 /vue-proxy/** 路径到 static/vue-proxy/ 目录
        registry.addViewController("/").setViewName("forward:/index.html");
        // registry.addViewController("/fileserver/**").setViewName("forward:/index.html");
    }

}